package br.unesp.demac.bcc.soo.clarus.dao;

import br.unesp.demac.bcc.soo.clarus.bean.Aluno;
import br.unesp.demac.bcc.soo.clarus.util.FabricaConexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 *
 * @author Evaldo
 */
public class AlunoDAOImp implements AlunoDAO {
    
    /**
     * Salva dados de aluno
     * @param conn Conexão
     * @param alun Aluno a ser inserido
     * @param idUsuario Id Usuário
     */
    public boolean salvarAluno(Aluno aluno) throws SQLException {
        boolean salvo = false;
        final String query = "INSERT INTO aluno (Usuario_idUsuario, ra) " +
                "VALUES (?, ?);";
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement pstmt = null;

        if (conn != null) {
            try {
                conn.setAutoCommit(false);

                UsuarioDAO udao = new UsuarioDAOImp();
                int idUsuario = udao.salvarUsuario(conn, aluno);

                if (idUsuario > -1) {
                    aluno.setId(idUsuario);
                } else {
                    throw new Exception();
                }

                pstmt = conn.prepareStatement(query);
                pstmt.setInt(1, idUsuario);
                pstmt.setLong(2, aluno.getRa());
                pstmt.execute();

                LoginDAO ldao = new LoginDAOImp();
                ldao.salvarLogin(conn, aluno.getLogin(), idUsuario);

                conn.commit();
                salvo = true;
            } catch (SQLException ex) {
                System.out.println("Erro ao inserir aluno: " + ex.getMessage());
                throw ex;
            } catch (Exception ex) {
                System.out.println("Erro ao inserir aluno: " + ex.getMessage());
            } finally {
                FabricaConexao.fechar(conn, pstmt);
            }
        }
        return salvo;
    }

    public Aluno validaAluno(String loginUsuario, String loginSenha) throws SQLException {
        final String query = "SELECT ra FROM Aluno WHERE Usuario_idUsuario = ?;";
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        Aluno aluno = null;

        if (conn != null) {
            try {
                LoginDAO ldao = new LoginDAOImp();
                int idUsuario = ldao.validaLogin(conn, loginUsuario, loginSenha);

                if (idUsuario > -1) {
                    aluno = new Aluno();
                    aluno.setId(idUsuario);
                } else {
                    throw new Exception();
                }
                
                pstmt = conn.prepareStatement(query);
                pstmt.setInt(1, idUsuario);
                res = pstmt.executeQuery();

                if (res.next()) {
                    aluno.setRa(res.getLong("ra"));
                } else {
                    throw new Exception();
                }

                UsuarioDAO udao = new UsuarioDAOImp();
                aluno.setNome(udao.getUsuarioById(conn, idUsuario).getNome());
                aluno.setLogin(ldao.getLoginByUsuarioId(conn, idUsuario));

            } catch (SQLException ex) {
                System.out.println("Erro ao obter aluno: " + ex.getMessage());
                throw ex;
            } catch (Exception ex) {
                System.out.println("Erro ao obter aluno: " + ex.getMessage());
            } finally {
                FabricaConexao.fechar(conn, pstmt);
            }
        }
        return aluno;
    }
    
    public Aluno getAlunoByRA(long ra) throws SQLException {
        final String query = "SELECT Usuario_idUsuario, ra FROM Aluno WHERE ra = ?;";
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        Aluno aluno = null;

        if (conn != null) {
            try {
                
                int idUsuario = -1;
                pstmt = conn.prepareStatement(query);
                pstmt.setLong(1, ra);
                res = pstmt.executeQuery();

                if (res.next()) {
                    idUsuario = res.getInt("Usuario_idUsuario");
                    aluno = new Aluno();
                    aluno.setId(idUsuario);
                    aluno.setRa(res.getLong("ra"));
                } else {
                    throw new Exception();
                }

                UsuarioDAO udao = new UsuarioDAOImp();
                aluno.setNome(udao.getUsuarioById(conn, idUsuario).getNome());
                
                LoginDAO ldao = new LoginDAOImp();
                aluno.setLogin(ldao.getLoginByUsuarioId(conn, idUsuario));

            } catch (SQLException ex) {
                System.out.println("Erro ao obter aluno: " + ex.getMessage());
                throw ex;
            } catch (Exception ex) {
                System.out.println("Erro ao obter aluno: " + ex.getMessage());
            } finally {
                //FabricaConexao.fechar(conn, pstmt);
            }
        }
        return aluno;
    }
    
    public Aluno getAlunoByIdUsuario(int idUsuario) throws SQLException {
        final String query = "SELECT Usuario_idUsuario, ra FROM Aluno WHERE Usuario_idUsuario = ?;";
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        Aluno aluno = null;

        if (conn != null) {
            try {
                
                pstmt = conn.prepareStatement(query);
                pstmt.setLong(1, idUsuario);
                res = pstmt.executeQuery();

                if (res.next()) {
                    aluno = new Aluno();
                    aluno.setId(idUsuario);
                    aluno.setRa(res.getLong("ra"));
                } else {
                    throw new Exception();
                }

                UsuarioDAO udao = new UsuarioDAOImp();
                aluno.setNome(udao.getUsuarioById(conn, idUsuario).getNome());
                
                LoginDAO ldao = new LoginDAOImp();
                aluno.setLogin(ldao.getLoginByUsuarioId(conn, idUsuario));

            } catch (SQLException ex) {
                System.out.println("Erro ao obter aluno: " + ex.getMessage());
                throw ex;
            } catch (Exception ex) {
                System.out.println("Erro ao obter aluno: " + ex.getMessage());
            } finally {
                //FabricaConexao.fechar(conn, pstmt);
            }
        }
        return aluno;
    }
}
